Django'da maxsus foydalanuvchi modellarini joriy etish, global ilovalar autentifikatsiyasini yaxshilash bo'yicha qo'llanma. Eng yaxshi amaliyotlar va usullar.
Python Django autentifikatsiyasi: Global ilovalar uchun maxsus foydalanuvchi modellarini o'zlashtirish
Django'ning o'rnatilgan autentifikatsiya tizimi ko'plab veb-ilovalar uchun kuchli boshlang'ich nuqtadir. Biroq, ilovangiz kengayib, murakkablashgani sari, ayniqsa global auditoriya uchun, standart foydalanuvchi modeli yetarli bo'lmasligi mumkin. Aynan shu yerda maxsus foydalanuvchi modellari o'z o'rnini topadi, bu esa foydalanuvchi ma'lumotlari va autentifikatsiya jarayonlari ustidan ko'proq moslashuvchanlik va nazoratni taklif etadi. Ushbu keng qamrovli qo'llanma sizni Django'da maxsus foydalanuvchi modellarini yaratish va amalga oshirish jarayonida olib boradi, bu esa ilovangizni turli xil foydalanuvchi talablari va xavfsizlik masalalarini hal qilish uchun yaxshi jihozlanganligini ta'minlaydi.
Nima uchun maxsus foydalanuvchi modelidan foydalanish kerak?
Standart Django foydalanuvchi modeli username, password, email, first_name va last_name kabi umumiy atributlar bilan ishlab chiqilgan. Oddiy ilovalar uchun mos bo'lsa-da, quyidagi hollarda ko'pincha yetarli bo'lmaydi:
- Qo'shimcha foydalanuvchi ma'lumotlarini saqlash: Foydalanuvchi afzalliklari, turli formatlardagi manzillari, afzal ko'rilgan valyutalar yoki til sozlamalarini saqlashi kerak bo'lgan global elektron tijorat platformasini ko'rib chiqing. Bular standart model doirasidan tashqarida.
- Autentifikatsiya maydonini o'zgartirish: Balki siz foydalanuvchilarni username o'rniga elektron pochta manzili orqali autentifikatsiya qilishni xohlarsiz yoki qo'shimcha maydonlarni talab qiladigan ko'p faktorli autentifikatsiyani amalga oshirishni xohlaysiz.
- Mavjud ma'lumotlar bazalari bilan integratsiya: Agar siz Django ilovasini boshqa foydalanuvchi sxemasiga ega mavjud ma'lumotlar bazasi bilan integratsiya qilayotgan bo'lsangiz, maxsus foydalanuvchi modeli modelingizni mavjud ma'lumotlar tuzilmasiga bog'lash imkonini beradi.
- Xavfsizlikni oshirish: Maxsus modellar parolni xeshlashtirish, parolni tiklash mexanizmlari va boshqa xavfsizlik bilan bog'liq jihatlar ustidan ko'proq nazoratni ta'minlaydi.
- Turli foydalanuvchi rollarini amalga oshirish: Rolga asoslangan kirishni boshqarish (RBAC) ma'lumotlarini to'g'ridan-to'g'ri modelda saqlash (yoki unga havola qilish) umumiy guruhlar va ruxsatlardan ko'ra moslashuvchan va aniq nazoratni taklif qiladi.
Maxsus foydalanuvchi modelidan foydalanish Django autentifikatsiya tizimini to'g'ridan-to'g'ri o'zgartirmasdan foydalanuvchi profilini kengaytirishning toza va qulay usulini ta'minlaydi. Bu kelajakdagi o'sishni kutayotgan yoki maxsus foydalanuvchi ma'lumotlarini talab qiladigan har qanday loyiha uchun eng yaxshi amaliyotdir.
Maxsus foydalanuvchi modelini qachon amalga oshirish kerak?
Maxsus foydalanuvchi modelini amalga oshirish uchun eng yaxshi vaqt loyihangizning boshlanishi hisoblanadi. Foydalanuvchi modelini ishlab chiqarish muhitida o'zgartirish murakkab va potentsial ravishda ma'lumotlarga zarar yetkazishi mumkin. Agar loyihangiz allaqachon boshlangan bo'lsa, o'zgartirish kiritishdan oldin oqibatlarini diqqat bilan ko'rib chiqing va mustahkam migratsiya rejasini tuzing.
Mana umumiy ko'rsatma:
- Maxsus foydalanuvchi modeli bilan boshlang: Agar siz kengaytirilgan foydalanuvchi ma'lumotlari yoki maxsus autentifikatsiya mantig'iga ehtiyoj sezsangiz.
- Migratsiyani diqqat bilan ko'rib chiqing: Agar sizda foydalanuvchilar bilan ishlaydigan Django loyihasi mavjud bo'lsa va maxsus modelga o'tishga qaror qilsangiz. Ma'lumotlar bazangizni zaxiralang va migratsiya jarayonini to'liq tushunib oling.
Maxsus foydalanuvchi modelini yaratish
Django'da maxsus foydalanuvchi modelini yaratishning ikkita asosiy yondashuvi mavjud:
- AbstractBaseUser: Ushbu yondashuv sizga foydalanuvchi modeli ustidan to'liq nazorat beradi. Siz barcha maydonlarni, shu jumladan username, password, email va kerakli maxsus maydonlarni belgilaysiz.
- AbstractUser: Ushbu yondashuv standart Django foydalanuvchi modelidan meros bo'lib, mavjud maydonlarni qo'shish yoki bekor qilish imkonini beradi. Agar sizga faqat bir nechta qo'shimcha maydon qo'shish kerak bo'lsa, bu oddiyroq.
1. AbstractBaseUser (To'liq nazorat) dan foydalanish
Bu eng moslashuvchan variant bo'lib, sizga butun foydalanuvchi modelini noldan belgilash imkonini beradi. Bu foydalanuvchi ma'lumotlari tuzilmasi va autentifikatsiya jarayoni ustidan eng katta nazoratni ta'minlaydi. Mana qanday:
1-qadam: Maxsus foydalanuvchi modelini yarating
Django ilovangizda (masalan, 'accounts'), `models.py` faylini yarating va `AbstractBaseUser` va `PermissionsMixin` dan meros oluvchi maxsus foydalanuvchi modelingizni aniqlang:
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
class CustomUserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
if not email:
raise ValueError('The Email field must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
extra_fields.setdefault('is_active', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self.create_user(email, password, **extra_fields)
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True, verbose_name='email address')
first_name = models.CharField(max_length=150, blank=True)
last_name = models.CharField(max_length=150, blank=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
date_joined = models.DateTimeField(auto_now_add=True)
# Custom fields (Example: preferred language, timezone, etc.)
preferred_language = models.CharField(max_length=10, default='en', choices=[('en', 'English'), ('fr', 'French'), ('es', 'Spanish')])
timezone = models.CharField(max_length=50, default='UTC')
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = [] # Required when creating a superuser
objects = CustomUserManager()
def __str__(self):
return self.email
Tushuntirish:
- CustomUserManager: Ushbu sinf maxsus foydalanuvchi modelingizni boshqarish uchun zarur. U foydalanuvchilar va superuser'larni yaratishni boshqaradi. `normalize_email` turli xil lokalizatsiyalar va kiritish usullarida elektron pochtaning bir xilligini ta'minlash uchun muhimdir.
- CustomUser: Bu sizning maxsus foydalanuvchi modelingiz.
- `email = models.EmailField(unique=True, verbose_name='email address')`: Elektron pochta maydonini foydalanuvchi uchun yagona identifikator sifatida belgilaydi. `unique=True`dan foydalanish har bir foydalanuvchi yagona elektron pochta manziliga ega bo'lishini ta'minlaydi. Verbose name administrator interfeysini yaxshilaydi.
- `first_name`, `last_name`: Foydalanuvchi nomini saqlash uchun standart maydonlar. `blank=True` bu maydonlarning bo'sh bo'lishiga imkon beradi.
- `is_staff`, `is_active`: Foydalanuvchining admin paneliga kirishini va hisobni faollashtirishni nazorat qilish uchun standart maydonlar.
- `date_joined`: Foydalanuvchi hisobi yaratilgan sanani yozib oladi.
- `preferred_language`, `timezone`: Foydalanuvchi afzalliklarini saqlash uchun namuna maxsus maydonlar. `choices` argumenti mumkin bo'lgan til variantlarini cheklaydi. Bu global ilova uchun juda muhim. Vaqt mintaqasi ham lokalizatsiya uchun muhim.
- `USERNAME_FIELD = 'email'`: Elektron pochta maydoni autentifikatsiya uchun username sifatida ishlatilishini belgilaydi.
- `REQUIRED_FIELDS = []`: `createsuperuser` buyrug'i yordamida superuser yaratishda talab qilinadigan maydonlarni belgilaydi. Bu holda, elektron pochta va paroldan tashqari qo'shimcha maydonlar talab qilinmaydi.
- `objects = CustomUserManager()`: Maxsus foydalanuvchi menejerini modelga tayinlaydi.
- `__str__(self)`: Foydalanuvchi obyekti qanday qilib satr sifatida ifodalanishini belgilaydi (masalan, admin panelida).
2-qadam: `settings.py` faylini yangilang
Django'ga maxsus foydalanuvchi modelingizdan foydalanishni `settings.py` faylingizga quyidagi qatorni qo'shish orqali ayting:
AUTH_USER_MODEL = 'accounts.CustomUser'
`accounts`ni `CustomUser` modelini aniqlagan ilovangiz nomi bilan almashtiring.
3-qadam: Migratsiyalarni yarating va qo'llang
Migratsiyalarni yaratish va qo'llash uchun quyidagi buyruqlarni ishga tushiring:
python manage.py makemigrations
python manage.py migrate
Bu sizning maxsus foydalanuvchi modelingiz uchun yangi ma'lumotlar bazasi jadvalini yaratadi.
4-qadam: Maxsus foydalanuvchi modelidan foydalanish
Endi siz maxsus foydalanuvchi modelingizni ko'rinishlaringizda, shablonlaringizda va ilovangizning boshqa qismlarida ishlatishingiz mumkin. Masalan, yangi foydalanuvchi yaratish uchun:
from accounts.models import CustomUser
user = CustomUser.objects.create_user(email='user@example.com', password='password123', first_name='John', last_name='Doe')
2. AbstractUser (standart modelga qo'shish) dan foydalanish
Agar siz standart Django foydalanuvchi modeliga faqat bir nechta qo'shimcha maydon qo'shishingiz kerak bo'lsa, bu yondashuv soddaroq. U `AbstractUser`dan barcha mavjud maydonlar va usullarni meros qilib oladi. Bu oddiyroq sozlash uchun osonroq bo'lishi mumkin.
1-qadam: Maxsus foydalanuvchi modelini yarating
Django ilovangizning `models.py` faylida `AbstractUser`dan meros oluvchi maxsus foydalanuvchi modelingizni aniqlang:
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
# Add extra fields here
phone_number = models.CharField(max_length=20, blank=True, verbose_name='Phone Number')
profile_picture = models.ImageField(upload_to='profile_pictures/', blank=True)
# Custom fields (Example: preferred currency, address format, etc.)
preferred_currency = models.CharField(max_length=3, default='USD', choices=[('USD', 'US Dollar'), ('EUR', 'Euro'), ('JPY', 'Japanese Yen')])
address_format = models.CharField(max_length=50, blank=True, help_text='e.g., \"Name, Street, City, Zip, Country\"')
def __str__(self):
return self.username
Tushuntirish:
- CustomUser: Bu sizning maxsus foydalanuvchi modelingiz, `AbstractUser`dan meros oladi.
- `phone_number`, `profile_picture`: Foydalanuvchi modeliga qo'shish uchun namuna maydonlar. `upload_to` profil rasmlari qayerda saqlanishini belgilaydi.
- `preferred_currency`, `address_format`: Global ilovalar uchun tegishli namuna maxsus maydonlar. Turli mamlakatlarda manzil formatlari juda farq qiladi.
- `__str__(self)`: Foydalanuvchi obyekti satr sifatida qanday ifodalanishini belgilaydi (masalan, admin panelida). Bu yerda username ishlatiladi.
2-qadam: `settings.py` faylini yangilang
Avvalgidek, Django'ga maxsus foydalanuvchi modelingizdan foydalanishni `settings.py` faylingizga quyidagi qatorni qo'shish orqali ayting:
AUTH_USER_MODEL = 'accounts.CustomUser'
3-qadam: Migratsiyalarni yarating va qo'llang
Migratsiyalarni yaratish va qo'llash uchun quyidagi buyruqlarni ishga tushiring:
python manage.py makemigrations
python manage.py migrate
4-qadam: Maxsus foydalanuvchi modelidan foydalanish
Endi siz foydalanuvchi obyektlari bilan ishlashda qo'shilgan maydonlarga kirishingiz mumkin:
from accounts.models import CustomUser
user = CustomUser.objects.create_user(username='johndoe', password='password123', email='john.doe@example.com')
user.phone_number = '+15551234567'
user.preferred_currency = 'EUR'
user.save()
Global ilovalardagi maxsus foydalanuvchi modellari uchun eng yaxshi amaliyotlar
Global auditoriyaga mo'ljallangan ilovalar uchun maxsus foydalanuvchi modellarini amalga oshirayotganda, quyidagi eng yaxshi amaliyotlarni ko'rib chiqing:
1. Xalqaroizatsiyalash va lokalizatsiyalash (i18n & l10n)
Lokalga xos ma'lumotlarni saqlash: Modelingizni turli madaniy normalar va ma'lumotlar formatlariga moslashish uchun loyihalashtiring. Sanalar, vaqtlar, raqamlar va manzillarni lokalni hisobga olgan holda saqlang.
Misol:
from django.utils import timezone
class CustomUser(AbstractUser):
#...
date_of_birth = models.DateField(blank=True, null=True)
def get_localized_date_of_birth(self, language_code):
if self.date_of_birth:
return timezone.localtime(timezone.make_aware(datetime.datetime.combine(self.date_of_birth, datetime.time.min))).strftime('%x') # Format according to the locale
return None
2. Vaqt mintaqasini boshqarish
Har doim vaqt mintaqalarini to'g'ri saqlang va boshqaring. Vaqt mintaqasi ma'lumotlarini foydalanuvchi modelida saqlang va uni foydalanuvchining mahalliy vaqt mintaqasida sanalar va vaqtlarni ko'rsatish uchun ishlating.
Misol:
from django.utils import timezone
class CustomUser(AbstractUser):
#...
timezone = models.CharField(max_length=50, default='UTC')
def get_localized_time(self, datetime_obj):
user_timezone = pytz.timezone(self.timezone)
return timezone.localtime(datetime_obj, user_timezone)
3. Manzilni formatlash
Manzil formatlari mamlakatlar bo'yicha sezilarli darajada farq qiladi. Foydalanuvchilarga o'z manzillarini o'z joylashuvi uchun to'g'ri formatda kiritish imkonini beruvchi moslashuvchan manzil tizimini joriy qiling. Manzilni tasdiqlash va formatlashni boshqarish uchun uchinchi tomon kutubxonasi yoki xizmatidan foydalanishni ko'rib chiqing.
Misol:
class CustomUser(AbstractUser):
#...
country = models.CharField(max_length=50, blank=True)
address_line_1 = models.CharField(max_length=255, blank=True)
address_line_2 = models.CharField(max_length=255, blank=True)
city = models.CharField(max_length=100, blank=True)
postal_code = models.CharField(max_length=20, blank=True)
def get_formatted_address(self):
# Implement logic to format address based on country
if self.country == 'US':
return f'{self.address_line_1}\n{self.address_line_2}\n{self.city}, {self.postal_code}, {self.country}'
elif self.country == 'GB':
return f'{self.address_line_1}\n{self.address_line_2}\n{self.city}\n{self.postal_code}\n{self.country}'
else:
return 'Address format not supported'
4. Valyuta bilan ishlash
Agar ilovangiz moliyaviy tranzaksiyalarni o'z ichiga olsa, foydalanuvchining afzal ko'rgan valyutasini saqlang va uni narxlar va miqdorlarni ko'rsatish uchun ishlating. `babel` kabi kutubxonadan foydalanib, valyuta qiymatlarini foydalanuvchining lokalizatsiyasiga ko'ra formatlang.
Misol:
from babel.numbers import format_currency
class CustomUser(AbstractUser):
#...
preferred_currency = models.CharField(max_length=3, default='USD')
def get_formatted_price(self, amount):
return format_currency(amount, self.preferred_currency, locale='en_US') # Adjust locale as needed
5. Ma'lumotlarni tasdiqlash
Foydalanuvchi kiritmasining to'g'ri va izchil ekanligini ta'minlash uchun mustahkam ma'lumotlarni tasdiqlashni amalga oshiring. Ma'lumotlar yaxlitligini ta'minlash uchun Django'ning o'rnatilgan validatorlaridan foydalaning yoki maxsus validatorlarni yarating.
Misol:
from django.core.validators import RegexValidator
class CustomUser(AbstractUser):
#...
phone_number = models.CharField(
max_length=20,
blank=True,
validators=[
RegexValidator(
regex=r'^\+?\d{9,15}$',
message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed."
),
]
)
6. Xavfsizlik bo'yicha mulohazalar
Parolni xeshlashtirish: Django'ning autentifikatsiya tizimi standart bo'yicha kuchli parolni xeshlashtirish algoritmlaridan foydalanadi. So'nggi xavfsizlik yangilanishlaridan foydalanish uchun Django'ning eng so'nggi versiyasidan foydalanayotganingizga ishonch hosil qiling.
Ikki faktorli autentifikatsiya (2FA): Foydalanuvchi hisoblariga qo'shimcha xavfsizlik qatlamini qo'shish uchun 2FA ni amalga oshiring. Buning uchun `django-otp` kabi turli xil Django paketlari mavjud. Bu ayniqsa sezgir foydalanuvchi ma'lumotlari yoki moliyaviy tranzaksiyalar bilan ishlashda muhimdir.
Ma'lumotlarni himoya qilish: Ayniqsa, sezgir foydalanuvchi ma'lumotlari bilan ishlashda ma'lumotlarni himoya qilish va maxfiylikning eng yaxshi amaliyotlariga rioya qiling. GDPR va CCPA kabi tegishli ma'lumotlarni himoya qilish qoidalariga rioya qiling. Ma'lumotlarni shifrlash, anonimlashtirish va tokenizatsiya usullarini ko'rib chiqing.
7. Testlash
Maxsus foydalanuvchi modelingiz kutilganidek ishlashini va autentifikatsiya tizimingiz xavfsiz ekanligini ta'minlash uchun keng qamrovli unit testlar va integratsiya testlarini yozing. Turli stsenariylarni, shu jumladan to'g'ri va noto'g'ri foydalanuvchi kiritmasini, parolni tiklash ish oqimlarini va ruxsatlarni tekshirishni sinab ko'ring.
8. Hujjatlashtirish
Maxsus foydalanuvchi modelingizni va autentifikatsiya tizimingizni to'liq hujjatlashtiring. Bu boshqa ishlab chiquvchilar uchun kodingizni tushunish va saqlashni osonlashtiradi. Har bir maydonning maqsadi, autentifikatsiya oqimi va har qanday xavfsizlik masalasi haqidagi ma'lumotlarni kiriting.
Ilg'or usullar va mulohazalar
1. Maxsus foydalanuvchi menejerlari
`AbstractBaseUser` misolida ko'rsatilganidek, maxsus foydalanuvchi menejerlari foydalanuvchilarni yaratish va boshqarish uchun muhimdir. Ular sizga foydalanuvchilarni yaratish uchun maxsus mantiqni aniqlashga imkon beradi, masalan, ma'lum maydonlar uchun standart qiymatlarni o'rnatish yoki qo'shimcha tasdiqlashni amalga oshirish.
2. Proksi modellar
Proksi modellar ma'lumotlar bazasi sxemasini o'zgartirmasdan foydalanuvchi modeliga usullar qo'shish imkonini beradi. Bu ilovangizga xos bo'lgan maxsus mantiq yoki hisob-kitoblarni qo'shish uchun foydali bo'lishi mumkin.
3. Foydalanuvchi modelini profil modeli bilan kengaytirish
Foydalanuvchi modeliga to'g'ridan-to'g'ri ko'plab maydonlarni qo'shish o'rniga, foydalanuvchi modeli bilan bir-birga aloqador alohida profil modelini yaratishingiz mumkin. Bu foydalanuvchi modelingizni toza va tartibli saqlashga yordam beradi.
from django.db import models
from django.conf import settings
class UserProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='profile')
# Additional fields
bio = models.TextField(blank=True)
location = models.CharField(max_length=100, blank=True)
Foydalanuvchi yaratilganda avtomatik ravishda UserProfile yaratish uchun signal yaratishni unutmang:
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.conf import settings
from .models import UserProfile
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
4. Yagona Kirish (SSO)
Boshqa xizmatlar bilan integratsiyani talab qiladigan yirik tashkilotlar yoki ilovalar uchun OAuth 2.0 yoki SAML kabi protokollardan foydalangan holda yagona kirish (SSO) ni amalga oshirishni ko'rib chiqing. Django SSO integratsiyasini soddalashtiradigan bir nechta paketlarni taqdim etadi, masalan, `django-allauth`.
5. Audit jurnalizatsiyasi
Foydalanuvchi faoliyati va foydalanuvchi ma'lumotlaridagi o'zgarishlarni kuzatish uchun audit jurnalizatsiyasini amalga oshiring. Bu xavfsizlik monitoringi, moslik va nosozliklarni tuzatish uchun foydali bo'lishi mumkin. `django-auditlog` kabi paketlar bu jarayonni avtomatlashtirishga yordam beradi.
Xulosa
Django'da maxsus foydalanuvchi modellarini yaratish va amalga oshirish mustahkam va kengaytiriladigan autentifikatsiya tizimlarini, ayniqsa global ilovalar uchun qurish uchun zarur bo'lgan moslashuvchanlik va nazoratni ta'minlaydi. Ushbu qo'llanmada ko'rsatilgan eng yaxshi amaliyotlarga rioya qilish orqali siz ilovangiz turli xil foydalanuvchi talablarini qondirishga, ma'lumotlar yaxlitligini saqlashga va butun dunyo bo'ylab foydalanuvchilar uchun xavfsiz va qulay tajribani ta'minlashga yaxshi jihozlanganligiga ishonch hosil qilishingiz mumkin. Amalga oshirishingizni diqqat bilan rejalashtirishni, foydalanuvchilaringizning ehtiyojlarini hisobga olishni va jarayonning har bir bosqichida xavfsizlikni birinchi o'ringa qo'yishni unutmang. `AbstractBaseUser` va `AbstractUser` o'rtasidagi tanlov talab qilinadigan sozlash darajasiga bog'liq. Muhim o'zgarishlar uchun `AbstractBaseUser` ko'proq nazoratni taklif qiladi. Oddiy kengaytmalar uchun `AbstractUser` osonroq o'tishni ta'minlaydi. Maxsus foydalanuvchi modelining Django ilovangizning qolgan qismi bilan muammosiz integratsiyalashganligini va barcha xavfsizlik talablariga javob berishini ta'minlash uchun chuqur testlash juda muhimdir. Haqiqiy global tajribani taqdim etish uchun xalqaroizatsiyalash, lokalizatsiyalash va vaqt mintaqasini boshqarish bo'yicha eng yaxshi amaliyotlarni qabul qiling. Bu sizning ilovangizning butun dunyo bo'ylab turli bozorlarda muvaffaqiyati va qabul qilinishiga sezilarli hissa qo'shadi.